package NowCoder.Mathematics;
import java.util.*;

/**
 * HJ56 完全数计算
 * 简单  通过率：53.01%  时间限制：1秒  空间限制：32M
 * 知识点 基础数学
 * warning 校招时部分企业笔试将禁止编程题跳出页面，为提前适应，练习时请使用在线自测，而非本地IDE。
 * 描述
 * 完全数（Perfect number），又称完美数或完备数，是一些特殊的自然数。
 *
 * 它所有的真因子（即除了自身以外的约数）的和（即因子函数），恰好等于它本身。
 *
 * 例如：28，它有约数1、2、4、7、14、28，除去它本身28外，其余5个数相加，1+2+4+7+14=28。
 *
 * 输入n，请输出n以内(含n)完全数的个数。
 *
 * 数据范围：1≤n≤5×10^5
 * 输入描述：
 * 输入一个数字n
 *
 * 输出描述：
 * 输出不超过n的完全数的个数
 *
 * 示例1
 * 输入：
 * 1000
 * 输出：
 * 3
 * https://www.nowcoder.com/practice/7299c12e6abb437c87ad3e712383ff84?tpId=37&tqId=21279&ru=/exam/oj
 */
public class 完美数计算_HJ56 {
    public static void main(String[] args){
        //约数，又称因数。
        //整数a除以整数b(b≠0) 除得的商正好是整数而没有余数，我们就说a能被b整除，或b能整除a。a称为b的倍数，b称为a的约数。
        //在大学之前，"约数"一词所指的一般只限于正约数。约数和倍数都是二元关系的概念，不能孤立地说某个整数是约数或倍数。
        //一个整数的约数是有限的。同时，它可以在特定情况下成为公约数。
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            int n = scanner.nextInt();
            System.out.println(perfectNumber(n));
        }
    }

    //用来计算除自己以外的约数的和是否是等于自己本身的
    public static boolean approxAndIsPerfect(int n){
        //首先，先对边缘条件进行判断
        if(n <= 1){
            return false;
        }
        int sum = 0;
        for(int i = 1;i < n;i++){
            if(n % i == 0){
                sum += i;
            }
        }

        return sum == n;
    }

    public static int perfectNumber(int n){
        int num = 0;

        for(int i = 0;i <= n;i++){
            if(approxAndIsPerfect(i)){
                num++;
            }
        }

        return num;
    }
}
